package main

import "fmt"

// 接口的定义
// type 接口类型 interface{ 方法名(参数)(返回值)}  用来给变量、参数、返回值等设置类型
// 接口是一种类型，一个变量如果实现了接口中规定的所有方法，那么这个变量就实现了这个接口，可以称为这个接口类型的变量,接口就是一组方法的签名
// 接口实现了一组方法,如果某个对象实现某个接口的所有方法,则此对象就实现了该接口
// 接口对象不访问实现类中的属性
//引用接口的实例
type speaker interface { //定义一个接口类型
	speak() //定义speak方法，只有实现了speak方法的变量都是speaker类型
}
type cat struct { //定义结构体类型

}

type dog struct {
} //定义结构体类型

func (c cat) speak() { // 值类型接收者  实现speak()这个方法
	fmt.Println("喵喵喵")
}

func (d dog) speak() {
	fmt.Println("汪汪汪")
}

func da(x speaker) { //定义一个参数为结构体类型且没有返回值的函数
	//接收一个参数。传什么进来，就打印什么
	x.speak()
}
func main() {
	var c1 cat
	var d1 dog
	da(c1)
	da(d1)
	var ss speaker //定义一个接口类型变量ss
	ss = c1
	fmt.Println(ss)
}
